package com.hyhy.hycloud.uaa.model;

import java.util.ArrayList;
import java.util.List;

/**
 * 树
 *
 * @author Xuegui Yuan
 * @date 2019-01-08
 */
public interface Tree<E, ID> extends Comparable<E>{

    /**
     * 获取ID
     *
     * @return ID
     */
    ID getId();

    /**
     * 获取父级ID
     *
     * @return 父级ID
     */
    ID getPid();

    /**
     * 设置子节点
     *
     * @param children 子节点
     */
    void setChildren(List<E> children);

    /**
     * 转换子数据集合
     *
     * @param topId      顶级ID
     * @param sourceList 转换前的列表
     * @param <ID>       ID
     * @param <E>        对象
     * @return 树结构列表
     */
    static <ID, E extends Tree<E, ID>> List<E> toTreeList(ID topId, List<E> sourceList) {
        List<E> resultList = new ArrayList<>();

        // 获取顶层元素集合
        ID parentId;
        for (E entity : sourceList) {
            parentId = entity.getPid();
            if (parentId == null || topId.equals(parentId)) {
                resultList.add(entity);
            }
        }

        // 获取每个顶层元素的子数据集合
        for (E entity : resultList) {
            entity.setChildren(getSubList(entity.getId(), sourceList));
        }

        return resultList;
    }

    /**
     * 获取子集合
     *
     * @param id         本级ID
     * @param sourceList 转换前的列表
     * @param <ID>       ID
     * @param <E>        对象
     * @return 树结构列表
     */
    static <ID, E extends Tree<E, ID>> List<E> getSubList(ID id, List<E> sourceList) {
        List<E> childList = new ArrayList<>();
        ID parentId;

        // 子集的直接子对象
        for (E entity : sourceList) {
            parentId = entity.getPid();
            if (id.equals(parentId)) {
                childList.add(entity);
            }
        }

        // 子集的间接子对象
        for (E entity : childList) {
            entity.setChildren(getSubList(entity.getId(), sourceList));
        }

        // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }

        return childList;
    }
}
